﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace AutoParsers
{
    public class AutoGeParser : IAutoParser
    {
        public ParsedCar ParseAuto(string url)
        {
            //TODO implement function
            // if can't parse because of url throw InvalidUrlException
            ParsedCar car = new ParsedCar();
            try
            {
                string autoGeCarId = url.Substring(url.IndexOf("=") + 1);

                using (WebClient client = new WebClient())
                {
                    client.Encoding = System.Text.Encoding.UTF8;
                    var doc = new HtmlAgilityPack.HtmlDocument();
                    doc.LoadHtml(client.DownloadString(url));

                    //reading html

                    var car_specification_indexes = doc.DocumentNode.SelectNodes("//div[@class='car-specification-index']");

                    var car_specification_values = doc.DocumentNode.SelectNodes("//div[@class='car-specification-value']");

                    var specification_2 = doc.DocumentNode.SelectNodes("//div[@id='tab-content-2']");

                    var imageDivs = doc.DocumentNode.SelectNodes("//div[@class='pointer car-mini-image-div ml1']");

                    var maxPrice = doc.DocumentNode.SelectSingleNode("//span[@id='max-offer-price']");

                    var time = doc.DocumentNode.SelectSingleNode("//span[@class='tooltip']");

                    var name = doc.DocumentNode.SelectSingleNode("//span[@class='orange serif']");

                    var sellerInfo = doc.DocumentNode.SelectNodes("//div[@class='car-person-info']");

                    var forPrice = doc.DocumentNode.SelectNodes("//span[@class='serif']");


                    string price = forPrice[1].InnerText;



                    System.IO.Directory.CreateDirectory(@"C:\" + autoGeCarId);  //directory for car


                    //downloading images

                    if (imageDivs != null)
                    {
                        car.Images = new List<string>();
                        foreach (var item in imageDivs)
                        {
                            string imageName = item.OuterHtml.Substring(item.OuterHtml.IndexOf(@"ThumbClickChangeCarPic('") + @"ThumbClickChangeCarPic('".Length, item.OuterHtml.IndexOf(@".jpg") - item.OuterHtml.Substring(0, item.OuterHtml.IndexOf(@"ThumbClickChangeCarPic('") + @"ThumbClickChangeCarPic('".Length).Length + 4);

                            string imageUrl = @"http://auto.ge/uploads/img/l/" + imageName;

                            string localFilename = @"c:\" + autoGeCarId + "\\" + imageName;

                            car.Images.Add(localFilename);

                            DownloadRemoteImageFile(imageUrl, localFilename);
                        }
                    }

                    //car.Price = decimal.Parse(price);
                    car.Owner = new Owner()
                    {
                        FullName = sellerInfo[0].InnerText,
                        Mobile = sellerInfo[1].InnerText
                    };
                    car.Category = car_specification_values[0].InnerText;
                    car.Engine = car_specification_values[1].InnerText;
                    //car.Mileage = decimal.Parse(car_specification_values[2].InnerText);
                    car.Cylinders = Int32.Parse(car_specification_values[3].InnerText);
                    car.Doors = car_specification_values[4].InnerText;
                    //vedushi car_specification_values[5].InnerText
                    car.FuelType = car_specification_values[6].InnerText;
                    car.Color = car_specification_values[7].InnerText;
                    car.Transmission = car_specification_values[8].InnerText;
                    car.WheelType = car_specification_values[9].InnerText;
                    car.Condition = car_specification_values[10].InnerText;
                    car.Location = car_specification_values[11].InnerText;


                    List<String> spectInStrings = new List<string>();
                    foreach (var item in specification_2)
                    {
                        spectInStrings.Add(item.InnerText);
                    }

                    foreach (var item in specification_2)
                    {
                        switch (item.InnerText)
                        {
                            case "ABS (ბლოკირების საწინააღმდეგო სისტემა)":
                                break;
                            case "EBD (დამუხრუჭების ძალის გადანაწილების სისტემა)":
                                break;
                            case "ESC (კურსის შენარჩუნების სისტემა)":
                                break;
                            case "TCS (დაბუქსავების საწინააღმდეგო სისტემა)":
                                break;
                            case "აირბაგები - წინა და გვერდითა":
                                car.Airbags = 1;
                                break;
                            case "სიგნალიზაცია":
                                car.Alarm = true;
                                break;
                            case "ცენტრალური საკეტი":
                                break;
                            case "იმობილაიზერი":
                                break;
                            case "ბორტკომპიუტერი":
                                car.BoardComputer = true;
                                break;
                            case "კრუიზ კონტროლი":
                                car.CruiseControl = true;
                                break;
                            case "კონდიციონერი":
                                car.AirConditioning = true;
                                break;
                            case "კლიმატკონტროლი":
                                car.ClimateControl = true;
                                break;
                            case "ელ.შუშები":
                                car.ElMirrors = true;
                                break;
                            case "ელ.სარკეები":
                                car.ElMirrors = true;
                                break;
                            case "სარკეების გათბობა":
                                car.MirrorsWarm = true;
                                break;
                            case "ლუქი":
                                break;
                            case "სავარძლების გათბობა":
                                break;
                            case "ჰიდრავლიკა":
                                car.Hydraulics = true;
                                break;
                            case "წინა სავარძლების რეგულირება - სიმაღლეში – მექანიკური":
                                car.FrontSeatSdjust = true;
                                break;
                            case "წინა სავარძლების რეგულირება - სიმაღლეში – ავტომატური":
                                car.FrontSeatSdjust = true;
                                break;
                            case "საჭის რეგულირება - მაღლა–დაბლა და ახლო–შორს":
                                car.SteeringWheelAdjust = true;
                                break;
                        }
                    }



                    //creating text document

                    using (TextWriter textWriter = File.CreateText(@"C:\" + autoGeCarId + "\\" + autoGeCarId + ".txt"))
                    {
                        textWriter.Write(textWriter.NewLine + "სახელი: " + name.InnerText + textWriter.NewLine);

                        textWriter.Write(textWriter.NewLine + "###  ძირითადი მახასიათებლები  ###" + textWriter.NewLine + textWriter.NewLine);

                        for (int i = 0; i < car_specification_indexes.Count; i++)
                        {
                            textWriter.Write(car_specification_indexes[i].InnerText + " " + car_specification_values[i].InnerText);
                            textWriter.Write(textWriter.NewLine);
                        }

                        textWriter.Write(textWriter.NewLine + "###  კომპლექტაცია  ###" + textWriter.NewLine + textWriter.NewLine);

                        foreach (var item in specification_2[0].ChildNodes[1].ChildNodes)
                        {
                            if (item.InnerText != "")
                            {
                                textWriter.Write(item.InnerText);
                                textWriter.Write(textWriter.NewLine);
                            }
                        }

                        textWriter.Write(textWriter.NewLine + "მაქსიმალური თანხა: " + maxPrice.InnerText + textWriter.NewLine);

                        textWriter.Write(textWriter.NewLine + "განთავსებულია: " + time.InnerText + textWriter.NewLine);

                        textWriter.Write(textWriter.NewLine + "### გამყიდველი ###" + textWriter.NewLine);

                        int contactInfoCounter = 0;

                        foreach (var item in sellerInfo)
                        {
                            if (contactInfoCounter == 2)
                                break;
                            ++contactInfoCounter;
                            textWriter.Write(item.InnerText + textWriter.NewLine);
                        }

                    }

                }

            }
            catch //(Exception ex)
            {
            }



            return car;


            throw new NotImplementedException();
        }

        private static void DownloadRemoteImageFile(string uri, string fileName)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            if ((response.StatusCode == HttpStatusCode.OK ||
                response.StatusCode == HttpStatusCode.Moved ||
                response.StatusCode == HttpStatusCode.Redirect) &&
                response.ContentType.StartsWith("image", StringComparison.OrdinalIgnoreCase))
            {
                using (Stream inputStream = response.GetResponseStream())
                using (Stream outputStream = File.OpenWrite(fileName))
                {
                    byte[] buffer = new byte[4096];
                    int bytesRead;
                    do
                    {
                        bytesRead = inputStream.Read(buffer, 0, buffer.Length);
                        outputStream.Write(buffer, 0, bytesRead);
                    } while (bytesRead != 0);
                }
            }
        }
    }
}
